package cn.com.se.多线程.ConcurrentUtils;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 对ConcurrentHashMap的总结
 */
public class ConcurrentHashMapTest {

    /**
     * 底层实现原理：
     *      ConcurrentHashMap中使用分段锁（Segment）,内部结构为拥有一个Entry数组中的每一个元素都是一个链表；同时又是一个ReentrantLock
     * 承受并发能力:
     *      1、ConcurrentHashMap的分段数组(Segment[])的默认长度为16，所以ConcurrentHashMap的分段锁默认可以同时16个线程操作且不产生锁竞争。
     *      2、ConcurrentHashMap的分段数组(Segment[])的长度可以通过构造方法设置，当用户设置并发度时ConcurrentHashMap会使用大于等于该值的最小2幂指数作为实际并发度 例如:(假如用户设置并发度为17，实际并发度则为32)
     *      3、如果并发度设置的过小，会带来严重的锁竞争问题；如果并发度设置的过大，原本位于同一个Segment内的访问会扩散到不同的Segment中，CPU cache命中率会下降，从而引起程序性能下降。
     */
    private static ConcurrentHashMap<String, Object> concurrentHashMap = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        concurrentHashMap.put("key1", "key1");
    }
}
